﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NumeroAleatorio
{
   public class Numero
   {
       #region Propiedades

       public virtual int NumOrden { get; set; }
       private  double aXn_c{get;set;}
       public double numeroAleatorio { get; set; }
       public double distribucionUniforme { get;set;}

       #endregion
      
       #region MetodosCalcular

       //Metodo que me calcula el (aXn+c)
       public virtual void Calcular_aXn_c(double a, double Xn, double? c)
       {
           double vc = c.HasValue ? c.Value : 0;
           aXn_c = ((a * Xn) + vc);

       }

       //Metodo que me calcula el Numero Aleatorio ((aXn+c)Modm)
       public virtual void Calcular_Modm(double m)
       {
           numeroAleatorio = (aXn_c % m);
       }
       
       //Metodo que me calcula la Distribucion uniforme, valor comprendido entre U(0,1)
       public virtual void CalcularDistribucionUniforme(double m, double aXn_1)
       {
           distribucionUniforme = (aXn_1 / m);
       }

       public virtual void GenerarNumeroAleatorio(double m, double a, double Xn, double? c)
       {
           Calcular_aXn_c(a, Xn, c);
           Calcular_Modm(m);
           CalcularDistribucionUniforme(m, Xn);
           
       }
       #endregion
       
       #region MetodosMostrar

       //Metodo que me permite ver el numero aleatorio generado por el metodo correspondiente
       public virtual double MostrarNumeroAleatorio()
       {
           return aXn_c;
       }

       //Metodo que me muestra el Xn+1
       public virtual double Mostrar_Xn_1()
       {

           return numeroAleatorio;
       }

       public virtual double MostrarDistribucionUniforme()
       {

           return distribucionUniforme;
       }
   }
       #endregion
       
}
